package araujoCoronelVillamayor.plantasVsZombies.domain

import java.util.ArrayList
import org.uqbar.commons.model.UserException
import org.uqbar.commons.utils.Observable
import java.io.Serializable

@Observable
class Fila implements Serializable {
	ArrayList<Planta> casillerosPlanta 
	static int cantidadMaximaPlantas = 3
	@Property String tipo
	@Property int cantidadPlantas
	JardinZen jardinZen
	int lugaresLibres
	
	new(String tipoFilaParametro, JardinZen jardinZenParametro) {
		tipo = tipoFilaParametro
		casillerosPlanta = new ArrayList<Planta>
		jardinZen = jardinZenParametro
	}
	
	def plantar(Planta unaPlanta){//EnCasillero(Planta unaPlanta, int idCasillero){
		//casilleros.get(idCasillero).plantar(unaPlanta)
		//--------------------------------------------------------------------
		//PENSANDO EN UNA FORMA DE AÑADIR UN ELEMENTO EN DETERMINADA POSICIÓN
		//--------------------------------------------------------------------
		//casillerosPlanta.set(idCasillero, unaPlanta)
		if (this.hayEspacio){
			casillerosPlanta.add(unaPlanta)
		}
		else{
			throw new UserException("No hay espacio en la fila para agregar más plantas")
		}
	}
	
	def hayEspacio(){
		casillerosPlanta.size < cantidadMaximaPlantas
	}
	
	def int getCantidadPlantas(){
		casillerosPlanta.size
	}
	
	
	def Planta ultimaPlanta(){
		casillerosPlanta.last
	}
	
	def boolean hayPlantas(){
		!(casillerosPlanta.isEmpty)
	}
	
	def boolean estoyVacia(){
		this.cantidadPlantas == 0
	}
	
	def int getCantidadMaximaPlantas(){
		this.cantidadMaximaPlantas
	}
	
	def quitarPlanta(Planta unaPlanta){
		casillerosPlanta.remove(unaPlanta)
	}

//	def sosAtacada(AtaqueAppModel ataqueAppModel, Zombie zombie){
//		while (this.hayPlantas && zombie.tieneVida){
//			zombie.ataca(this.ultimaPlanta)
//
//			
//			//Si la planta vive, ataca al zombie
//			if (this.ultimaPlanta.tieneVida)
//				this.ultimaPlanta.ataca(zombie)
//			//Si la planta murió, hay que sacarla de la fila
//			else
//				this.quitarPlanta(this.ultimaPlanta)
//
//			//Evaluar resultados del ataque
//			ataqueAppModel.evaluarResultadosAtaque(this, zombie)
//		}
//	}
	
	def casillerosPlanta(){
		casillerosPlanta
	}
	
	def limpiar(){
		casillerosPlanta.clear
	}

	def plantasDelMismoTipo(){
		jardinZen.search(this.tipo)
	}
	
	def int getLugaresLibres(){
		Fila.cantidadMaximaPlantas - this.cantidadPlantas
	}
}